const t1 = new Date()
setTimeout(() => {
  const t3 = new Date()
  console.log('t3 - t1 =', t3 - t1)
}, 100)
let t2 = new Date()

while (t2 - t1 < 200) {
  t2 = new Date()
}
console.log('end')

console.log('script here')

// new Promise((resolve, reject) => {
//   console.log('1 promise')
//   resolve()
// })
//   .then(() => {
//     console.log('1 promise then')
//     return new Promise((resolve, reject) => {
//       console.log('2 promise')
//       resolve()
//     }).then(() => {
//       console.log('2 promise then')
//     })
//   })
//   .then(() => {
//     console.log('another promise')
//   })

// console.log('end here')

// console.log('1')

// setTimeout(function () {
//   console.log('2')
//   process.nextTick(function () {
//     console.log('3')
//   })
//   new Promise(function (resolve) {
//     console.log('4')
//     resolve()
//   }).then(function () {
//     console.log('5')
//   })
// })
// process.nextTick(function () {
//   console.log('6')
// })
// new Promise(function (resolve) {
//   console.log('7')
//   resolve()
// }).then(function () {
//   console.log('8')
// })

// setTimeout(function () {
//   console.log('9')
//   process.nextTick(function () {
//     console.log('10')
//   })
//   new Promise(function (resolve) {
//     console.log('11')
//     resolve()
//   }).then(function () {
//     console.log('12')
//   })
// })

// 前端模拟实现红路灯场景，红灯三秒，绿灯2秒，黄灯1秒。

function red() {
  console.log('red')
}
function green() {
  console.log('green')
}
function yellow() {
  console.log('yellow')
}

// 用回调函数实现
const task = (timer, light, callback) => {
  setTimeout(() => {
    if (light === 'red') {
      red()
    } else if (light === 'green') {
      green()
    } else if (light === 'yellow') {
      yellow()
    }

    callback()
  }, timer)
}

const step = () => {
  task(3000, 'red', () => {
    task(2000, 'green', () => {
      task(1000, 'yellow', step)
    })
  })
}

step()

// 用 promise 实现

// const task = (timer, light) => {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       if (light === 'red') {
//         red()
//       } else if (light === 'green') {
//         green()
//       } else if (light === 'yellow') {
//         yellow()
//       }
//       resolve()
//     }, timer)
//   })
// }
// const step = () => {
//   task(3000, 'red')
//     .then(() => {
//       task(2000, 'green')
//     })
//     .then(() => {
//       task(1000, 'yellow')
//     })
//     .then(step)
// }
// step()

// const step = async () => {
//   await task(3000, 'red')
//   await task(2000, 'green')
//   await task(1000, 'yellow')

//   step()
// }
step()
